#include "../server.hpp"
#include <fstream>


class Util
{
public:
    //字符串分割函数，将src字符串按照sep字符进行分割，得到的各个子串放到arry中，最终返回子串的数量
    static size_t Split(const std::string& src, const std::string& sep, std::vector<std::string>* arry)
    {
        size_t offset = 0;
        while (offset < src.size())
        {
            size_t pos = src.find(sep, offset);
            if (pos == src.npos)
            {
                arry->push_back(src.substr(offset));
                return arry->size();
            }
            if (pos != offset)//如果不是一个空串，就加入结果
                arry->push_back(src.substr(offset, pos - offset));
            offset = pos + sep.size();
        }
        return arry->size();
    }
    //读取文件内容，将读取的内容放到一个Buffer中
    static bool ReadFile(const std::string& filename, std::string* buf)
    {
        std::ifstream ifs(filename, std::ios::binary);
        if (!ifs.is_open())
        {
            printf("open %s file failed!!", filename.c_str());
            return false;
        }
        size_t fsize = 0;
        ifs.seekg(0, ifs.end);  //将文件偏移移动到文件的末尾
        fsize = ifs.tellg();    //此时偏移的位置就是文件的大小
        ifs.seekg(0, ifs.beg);  //将文件偏移移动到文件起始位置
        buf->resize(fsize);
        ifs.read(&(*buf)[0], fsize);
        if (ifs.good() == false)    //判断上次操作是否出问题
        {
            printf("read %s file failed!!", filename.c_str());
            ifs.close();
            return false;
        }
        ifs.close();
        return true;
    }
    //向文件写入数据
    static bool WriteFile(const std::string& filename, const std::string& buf)
    {
        std::ofstream ofs(filename, std::ios::binary | std::ios::trunc);    //trunc: 截断，不要文件的原有内容，即覆盖写
        if (!ofs.is_open())
        {
            printf("open %s file failed!!", filename.c_str());
            return false;
        }
        ofs.write(buf.c_str(), buf.size());
        if (ofs.good() == false)
        {
            ERR_LOG("write %s file failed!", filename.c_str());
            ofs.close();
            return false;
        }
        ofs.close();
        return true;
    }
    //URL编码
    static bool UrlEncode();
    //URL解码
    static bool UrlDecode();
    //响应状态码的描述信息获取
    static std::string StatuDesc();
    //根据文件后缀名获取文件mime
    static std::string ExtMime();
    //判断一个文件是否是一个目录
    static bool IsDirectory();
    //判断一个文件是否是一个普通文件
    static bool IsRegular();
    //http请求的资源路径有效性判断
    static bool ValidPath();
};